package Model;

import Controller.Controller;
import com.google.api.client.googleapis.media.MediaHttpUploader;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.HttpResponseException;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.ParentReference;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * Klasa odpowiedzialna za wielowątkowe wysyłanie plików na zdalny dysk.
 * @param model - referencja na model
 * @param drive - referencja na połączenie z dyskiem zdalnym
 * @param file - referencja na plik, który wysyłamy
 * @param parent_id - id pliku rodzica
 * @param controller - referencja na kontroler
 */
public class Upload extends Thread {
    
    private Model model;
    private Drive drive;
    private java.io.File file;
    private String parent_id;
    private Controller controller;
    /**
     * 
     * @param model - referencja na model
     * @param drive - referencja na połączenie z dyskiem zdalnym
     * @param file - referencja na plik, który wysyłamy
     * @param parent_id - id pliku rodzica
     * @param controller - referencja na kontroler
     */
    public Upload(Model model,Drive drive,java.io.File file, String parent_id, Controller controller) {
        this.model = model;
        this.drive = drive;
        this.file = file;
        this.parent_id = parent_id;
        this.controller = controller;
    }
            
    
    @Override
    public void run () {
        try {
            insertFile(file,parent_id);
        }
        catch(IOException | NullPointerException e) {
            throw new RuntimeException("Błąd przy wysyłaniu pliku: "+file.getName());
        }
        
    }
  /**
   * Wysyła plik na zdalny dysk
   * @param file - referencja na plik do wysłania.
   * @param parent_id - id pliku rodzica.
   * @throws IOException 
   * @throws NullPointerException
   * @throws HttpResponseException 
   */
  public void insertFile(java.io.File file, String parent_id) throws IOException, NullPointerException, HttpResponseException {
    List<ParentReference> parents = null;
    File body = new File();
    if(parent_id != null) {    
        ParentReference newParent = new ParentReference();
        newParent.setId(parent_id);
        parents = new ArrayList<>();
        parents.add(newParent);   
    }
   String extension;
   int dotPos = file.getName().lastIndexOf(".");
   extension = file.getName().substring(dotPos); 
   
   body.setParents(parents);
   body.setTitle(file.getName());
   body.setFileExtension(extension);
   
   FileContent mediaContent = new FileContent(null, file);
   Drive.Files.Insert upload;
   if(mediaContent.getLength() == 0L) {
          upload = drive.files().insert(body);
      }
   else {
          upload = drive.files().insert(body, mediaContent);
      }
   MediaHttpUploader uploader = upload.getMediaHttpUploader();
   uploader.setDirectUploadEnabled(false);
   uploader.setChunkSize(uploader.MINIMUM_CHUNK_SIZE);
   uploader.setProgressListener(new FileUploadProgressListener(controller,file.getName()));
   File f = upload.execute();
   } 
}
